package main

import (
	"fmt"
	"time"
)

//基于channel和select实现一个模拟核弹发射的场景
func main() {

	//想要的效果是，倒计时20秒，20秒内，输入任何内容都会停止核弹发射
	fmt.Println("准备发射核弹，任意输入将停止核弹发射")
	canLunchChan := make(chan bool)
	abortLunchChan := make(chan bool)
	go countDown(canLunchChan)
	go abortLunch(abortLunchChan)

	select {
	case <-canLunchChan:
		fmt.Println("进行发射")
	case <-abortLunchChan:
		fmt.Println("停止发射")
	}

	fmt.Println("程序结束")
}

func countDown(canLunch chan bool) {
	c := time.Tick(1 * time.Second) //内部实现估计是，每隔指定的时长就往c管道放入数据
	for i := 20; i > 0; i-- {
		fmt.Println("核弹发射倒计时", i, "秒")
		<-c //每过1秒
	}
	canLunch <- true
}

func abortLunch(abortLunch chan bool) {
	fmt.Scanln()
	abortLunch <- true
}
